package com.deer.wms.ware.task.service;

import com.deer.wms.intercept.common.data.CurrentUser;
import com.deer.wms.inventory.model.Inventory.Inventory;
import com.deer.wms.project.root.service.SuperService;
import com.deer.wms.system.manage.model.user.UserInfo;
import com.deer.wms.ware.task.model.SO.SoDetail;
import com.deer.wms.ware.task.model.SO.SoMaster;
import com.deer.wms.ware.task.model.Wave.WaveDetail;
import com.deer.wms.ware.task.model.out.OutMaster;
import com.deer.wms.ware.task.model.pickTask.PickTask;
import com.deer.wms.ware.task.model.pickTask.PickTaskCriteria;
import com.deer.wms.ware.task.model.pickTask.PickTaskDto;
import com.deer.wms.ware.task.model.pickTask.SeedingWallAlertInfo;

import java.util.List;


/**
 *
 * @author guo
 * @since 2020/02/02
 */
public interface PickTaskService extends SuperService<PickTask> {
    /**
     * 按条件查询
     * @param criteria criteria
     * @return 查询条件
     */
    List<PickTaskDto> findList(PickTaskCriteria criteria);

    /**
     * [旧]根据SO查询对应的拣货任务
     * @param criteria criteria条件
     * @return List<PickTaskDto>
     */
    List<PickTaskDto> findByBillNo(PickTaskCriteria criteria);

    /**
     * 根据SO的ID查询对应的拣货任务
     * @param soMaterId 出库任务id
     * @return List<PickTask>
     */
    List<PickTaskDto> findBySoMasterId(Integer soMaterId);

    /**
     * 通过出库任务明细查询其关联的拣货任务
     * @param soDetailId so明细id
     * @return List<PickTaskVo>
     */
    List<PickTask> findBySoDetailId(Integer soDetailId);

    /**
     * 查询波次相关的拣货任务
     * @param criteria
     * @return
     */
    List<PickTaskDto> findByWaveMasterId(PickTaskCriteria criteria);

    /**
     * 通过波次ID查询关联的拣货任务
     * @param waveId 波次ID
     * @return List<PickTaskDto>
     */
    List<PickTaskDto> findByWaveDetail(Integer waveDetailId);

    /**
     * 找到分配人相关的拣货任务
     * @param criteria criteria
     * @return List<PickTaskDto>
     */
    List<PickTaskDto> allotTask(PickTaskCriteria criteria);

    /**
     * 定时任务创建拣货任务
     * @param soType soType
     */
    void createPickTask(Integer soType);

    void sendToYfErp(PickTask pickTask, double pickQty, String barcode);

    /**
     * 为波次明细分配拣货任务
     * @param waveDetailList 波次明细
     * @param currentUser 当前用户
     */
    @Deprecated
    void createPickTask(List<WaveDetail> waveDetailList, UserInfo currentUser);

    /**
     * 按照单据号创建拣货任务
     * @param soMasterBillNo SO单据号
     * @param currentUser 当前用户
     */
    void createPickTask(SoMaster soMaster, CurrentUser currentUser);

    void createPickTask(SoDetail soDetail, CurrentUser currentUser);

    /**
     * 取消拣货任务
     * @param pickTask 待取消的拣货任务
     * @param currentUser 当前用户
     */
    void cancelPickTask(PickTask pickTask);

    List<PickTaskDto> findFirst(PickTaskCriteria criteria);

    /**
     * 生成越库的拣货任务
     * @param inventory 库存
     * @param acceptRecordId 验收单ID
     */
    void createBaoKuanPickTask(Inventory inventory,Integer acceptRecordId);

    /**
     * 根据SO单查询  按单出库
     * @param soNo SO编号
     * @return List<PickTaskDto>
     */
    List<PickTaskDto> findBySo(String soNo);


    List<SeedingWallAlertInfo> getSeedingWallAlertInfo(PickTaskCriteria criteria);


    /**
     * 拣货确认
     * @param pickTask 拣货任务
     * @param pickQty 拣货数量(可能多于计划数量)
     * @param currentUser 当前用户
     * @return Integer 目标库存ID
     */
    Integer commitPick(PickTask pickTask, double pickQty, CurrentUser currentUser);


    /**
     * 拣货任务拣货完毕直接发货
     * @param pickIds 拣货任务
     * @param currentUser 当前用户
     * @param erpAreaId
     */
    OutMaster pickAndSendOut(List<PickTask> pickIds, CurrentUser currentUser,Integer erpAreaId);

}
